﻿#pragma once
#include"Common.h"

//单例模式：饿汉模式
class CentralCache {
private:
	CentralCache() //不允许直接定义一个CentralCache对象
	{}
	CentralCache(const CentralCache& c) = delete; //CentralCache对象不能被拷贝
	CentralCache& operator=(const CentralCache& c) = delete; ////CentralCache对象不允许赋值

	static CentralCache _Singleton;

public:
	//获取和使用该单例对象:	
	static CentralCache* GetInstance() {
		return &_Singleton;
	}


	//1. ThreadCache层将部分内存块还给CentralCache
	void ReleaseMemoryToCentralCache(void*& start, size_t size);


	//2. 将指定内存块分给线程 , 分配batchNum个，每个大小size
	//因为是分配多个，所以需要start,end指针指向这多个以链表相连的内存块的头和尾
	size_t FetchRangeObj(void*& start, void*& end, size_t batchNum, size_t size);

	//3.从指定的SpanList中获取⼀个非空的span
	Span* GetOneSpan(SpanList& list, size_t size);



private:
	//单例模式下SpanList的构造函数可以被正常调用

	SpanList _spanlists[Span_LIST_NUM]; //Central Cache的哈希桶
	//一个SpanList就是一个桶的木板
};

